#include "FluTheme.h"

#include <QGuiApplication>
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
#include <QStyleHints>
#elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)))
#include <QtGui/qpa/qplatformtheme.h>
#include <QtGui/private/qguiapplication_p.h>
#else
#include <QPalette>
#endif
#include "Def.h"
#include "FluColors.h"

FluTheme::FluTheme(QObject *parent):QObject{parent}{
    //连接槽函数
    connect(this,&FluTheme::darkModeChanged,this,[=]{
        Q_EMIT darkChanged();
    });
    connect(this,&FluTheme::darkChanged,this,[=]{refreshColors();});
    connect(this,&FluTheme::themeColorChanged,this,[=]{refreshColors();});
    //设置颜色
    themeColor(FluColors::getInstance()->Blue());
    //默认白色主题
    darkMode(FluThemeType::DarkMode::Light);
    nativeText(false);
    enableAnimation(true);
    _systemDark = systemDark();
    //安装事件过滤器
    /*这条代码的作用是让当前对象（假设当前对象继承自 QObject）成为应用程序全局事件过滤器，用于拦截和处理应用程序中的所有事件
        一、事件过滤器的概念
            事件过滤器是 Qt 中一种强大的机制，允许一个对象在事件到达目标对象之前先拦截并处理这些事件。通过安装事件过滤器，可以对特定类型的事件进行预处理、修改或者完全阻止事件继续传递。
                二、代码的具体作用
                    qApp 是指向应用程序全局的 QApplication 对象的指针。
                        installEventFilter(this) 将当前对象（this）注册为事件过滤器。
                            这意味着当前对象的 eventFilter 函数将有机会在应用程序中的任何对象接收到事件之前先处理这些事件。
                                如果 eventFilter 函数返回 true，表示事件已经被处理，不会再传递给目标对象；如果返回 false，则事件将继续传递给目标对象进行常规处理。  */
    qApp->installEventFilter(this);
}

void FluTheme::refreshColors(){
    //是否是暗色模式
    auto isDark = dark();
    //主色调
    primaryColor(isDark ? _themeColor->lighter() : _themeColor->dark());
    //背景颜色
    backgroundColor(isDark ? QColor(0,0,0,255) : QColor(1,1,1,255));
    //窗口背景色
    windowBackgroundColor(isDark ? QColor(32,32,32,255) : QColor(237,237,237,255));
    //窗口活动背景色
    windowActiveBackgroundColor(isDark ? QColor(26,26,26,255) : QColor(243,243,243,255));
    //字体主色调
    fontPrimaryColor(isDark ? QColor(248,248,248,255) : QColor(7,7,7,255));
    //字体副色
    fontSecondaryColor(isDark ? QColor(222,222,222,255) : QColor(102,102,102,255));
    //字体颜色
    fontTertiaryColor(isDark ? QColor(200,200,200,255) : QColor(153,153,153,255));
    //项目正常颜色
    itemNormalColor(isDark ? QColor(255,255,255,0) : QColor(0,0,0,0));
    //项目悬停颜色
    itemHoverColor(isDark ? QColor(255,255,255,255*0.03) : QColor(0,0,0,255*0.03));
    //项目按下颜色
    itemPressColor(isDark ? QColor(255,255,255,255*0.06) : QColor(0,0,0,255*0.06));
    //项目检查颜色
    itemCheckColor(isDark ? QColor(255,255,255,255*0.09) : QColor(0,0,0,255*0.09));
}
//事件过滤器
bool FluTheme::eventFilter(QObject *obj, QEvent *event){
    //当在代码中有一个变量或参数被声明但在当前作用域中没有被实际使用时，编译器通常会发出警告。使用Q_UNUSED可以告诉编译器这个变量或参数是有意不被使用的，从而抑制警告的产生
    Q_UNUSED(obj);
    //QEvent::ApplicationPaletteChange 默认应用程序调色板已更改。 QEvent::ThemeChange主题改变
    if (event->type() == QEvent::ApplicationPaletteChange || event->type() == QEvent::ThemeChange)
    {
        _systemDark = systemDark();
        //Q_EMIT是一个用于发射信号的宏
        Q_EMIT darkChanged();
        //设置事件对象的接受标志，相当于调用 setAccepted(true)
        event->accept();
        return true;
    }
    return false;
}
//不知道有什么用
QJsonArray FluTheme::awesomeList(const QString& keyword){

    QJsonArray arr;//数组
    QMetaEnum enumType = Fluent_Awesome::staticMetaObject.enumerator(Fluent_Awesome::staticMetaObject.indexOfEnumerator("Fluent_AwesomeType"));
    for(int i=0; i < enumType.keyCount(); ++i){
        QString name = enumType.key(i);
        int icon = enumType.value(i);
        if(keyword.isEmpty() || name.contains(keyword)){
            QJsonObject obj;
            obj.insert("name",name);
            obj.insert("icon",icon);
            arr.append(obj);
        }
    }
    return arr;
}
//
bool FluTheme::systemDark(){
     return (QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark);
/*#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
    return (QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark);
#elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)))

    if (const QPlatformTheme * const theme = QGuiApplicationPrivate::platformTheme()) {
        return (theme->appearance() == QPlatformTheme::Appearance::Dark);
    }
    return false;
#else
    QPalette palette = qApp->palette();
    QColor color = palette.color(QPalette::Window).rgb();
    return !(color.red() * 0.2126 + color.green() * 0.7152 + color.blue() * 0.0722 > 255 / 2);
#endif*/
}

bool FluTheme::dark(){

        /*System = 0x0000,
        Light = 0x0001,
        Dark = 0x0002,*/


        if(_darkMode == 0x0002){
            return true;
        }else if(_darkMode == 0x0001){
            return false;
        }else if(_darkMode == 0x0000){
            return _systemDark;
        }else{
            return false;
        }

    /*if(_darkMode == FluThemeType::DarkMode::Dark){
        return true;
    }else if(_darkMode == FluThemeType::DarkMode::Light){
        return false;
    }else if(_darkMode == FluThemeType::DarkMode::System){
        return _systemDark;
    }else{
       */
}
